/** * Copyright (C) Intersect 2012. * * This module contains Proprietary Information of Intersect, * and should be treated as Confidential. */ package au.org.intersect.exsite9.wizard.metadatacategory; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import au.org.intersect.exsite9.domain.MetadataAttribute; import au.org.intersect.exsite9.domain.MetadataAttributeValue; import au.org.intersect.exsite9.domain.MetadataCategory; import au.org.intersect.exsite9.domain.Schema; import au.org.intersect.exsite9.domain.utils.AlphabeticalMetadataAttributeValueComparator; import au.org.intersect.exsite9.domain.utils.IDMetadataCategoryComparator; import au.org.intersect.exsite9.view.MetadataBrowserView; /** * Wizard page that lists the existing {@link MetadataCategory}s to the user, this page is only used if they select edit from the metadata menu and is not if they click one of the edit buttons in the {@link MetadataBrowserView} */ public final class ListMetadataCategoriesWizardPage extends WizardPage implements SelectionListener { private final Schema schema; private final List<MetadataCategory> metadataCategories; private final List<MetadataCategory> metadataCategoriesToDelete = new ArrayList<MetadataCategory>(); private final boolean showRemoveButton; private Composite container; private org.eclipse.swt.widgets.List metadataCategoriesList; private Button removeButton; private MetadataCategory selectedMetadataCategory; protected ListMetadataCategoriesWizardPage(final String title, final String description, final Schema schema, final boolean showRemoveButton) { super(title); setTitle(title); setDescription(description); this.schema = schema; this.showRemoveButton = showRemoveButton; this.metadataCategories = new ArrayList<MetadataCategory>(this.schema.getMetadataCategories()); Collections.sort(this.metadataCategories, new IDMetadataCategoryComparator()); } @Override public void createControl(final Composite parent) { this.container = new Composite(parent, SWT.NULL); final GridLayout layout = new GridLayout(); this.container.setLayout(layout); layout.numColumns = 2; this.metadataCategoriesList = new org.eclipse.swt.widgets.List(this.container, SWT.BORDER | SWT.SINGLE | SWT.WRAP | SWT.V_SCROLL); for (final MetadataCategory metadataCategory : this.metadataCategories) { this.metadataCategoriesList.add(metadataCategory.getName()); } final GridData multiLineGridData = new GridData(GridData.FILL_BOTH); this.metadataCategoriesList.setLayoutData(multiLineGridData); this.metadataCategoriesList.addSelectionListener(this); final Composite rowComp = new Composite(container, SWT.NULL); final RowLayout rowLayout = new RowLayout(); rowLayout.type = SWT.VERTICAL; rowLayout.pack = false; rowLayout.justify = true; rowComp.setLayout(rowLayout); this.removeButton = new Button(rowComp, SWT.PUSH); this.removeButton.setText("Delete"); this.removeButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(final SelectionEvent e) { final int selectedIndex = metadataCategoriesList.getSelectionIndex(); final MetadataCategory metadataCategoryToDelete = metadataCategories.remove(selectedIndex); metadataCategoriesList.remove(selectedIndex); metadataCategoriesToDelete.add(metadataCategoryToDelete); removeButton.setEnabled(false); selectedMetadataCategory = null; setPageComplete(true); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); this.removeButton.setEnabled(false); this.removeButton.setVisible(this.showRemoveButton); setControl(this.container); setPageComplete(false); } @Override public void widgetSelected(final SelectionEvent event) { setWizardButtonState(); } private void setWizardButtonState() { if (this.metadataCategoriesList.getSelectionCount() == 0) { this.removeButton.setEnabled(false); this.selectedMetadataCategory = null; setPageComplete(!this.metadataCategoriesToDelete.isEmpty()); } else { final int selectedIndex = this.metadataCategoriesList.getSelectionIndex(); this.selectedMetadataCategory = this.metadataCategories.get(selectedIndex); this.removeButton.setEnabled(true); setPageComplete(true); } } @Override public IWizardPage getNextPage() { final IWizardPage nextPage = super.getNextPage(); if (nextPage == null) { return null; } if (nextPage instanceof AddMetadataCategoryWizardPage1 && this.selectedMetadataCategory != null) { final AddMetadataCategoryWizardPage1 editMetadataCategoryPage = (AddMetadataCategoryWizardPage1) nextPage; editMetadataCategoryPage.setMetadataCategory(this.selectedMetadataCategory); editMetadataCategoryPage.setMetadataValues(this.selectedMetadataCategory.getValues()); final MetadataAttribute metadataAttribute = this.selectedMetadataCategory.getMetadataAttribute(); if (metadataAttribute != null) { final List<MetadataAttributeValue> vals = new ArrayList<MetadataAttributeValue>(metadataAttribute.getMetadataAttributeValues()); Collections.sort(vals, new AlphabeticalMetadataAttributeValueComparator()); editMetadataCategoryPage.setMetadataAttributeValues(vals); } editMetadataCategoryPage.reload(); } return nextPage; } @Override public void widgetDefaultSelected(final SelectionEvent event) { } MetadataCategory getSelectedMetadataCategory() { return this.selectedMetadataCategory; } List<MetadataCategory> getMetadataCategoriesToDelete() { return this.metadataCategoriesToDelete; } }